package com.pj;

import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.spring.SpringMVCUtil;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaFoxUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>Title: SaTokenConfigure </p>
 * <p>Description: SaTokenConfigure </p>
 * Package: com.pj.config
 * Company: 沪渝研究院
 * Copyright: Copyright(c) AI+X
 * Date: 2024/9/2 13:45
 *
 * @author zhangcheng
 * @version 1.0.0
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    @Value("sa-token.sso-client.server-url")
    private String serverUrl;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 匿名内部类定义拦截器
        HandlerInterceptor logoutInterceptor = new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                String path = request.getRequestURI();
                if ("/sso/logout".equals(path)) {
                    request.setAttribute("back",serverUrl+"/home");
                }
                // 允许请求继续向下执行
                return true;
            }
        };

        // 注册拦截器并指定拦截路径
        registry.addInterceptor(logoutInterceptor)
                .addPathPatterns("/sso/logout");
    }
//    /** 注册 [Sa-Token全局过滤器] */
//    @Bean
//    public SaServletFilter getSaServletFilter() {
//        return new SaServletFilter()
//                .addInclude("/**")
//                .addExclude("/sso/*", "/favicon.ico")   // 这里需要注意排除掉 /sso/* 相关请求不拦截，否则就会触发无限重定向
//                .setAuth(obj -> {
//                    /*
//                     * 这里会被分为两种情况：
//                     *  情况1：这个请求在当前 client 已经登录，此时会顺利进入网站
//                     *  情况2：这个请求在当前 client 尚未登录，此时会被拦截，重定向至当前系统的 /sso/login?back=当前地址
//                     *
//                     *  情况2会带领着用户继续重定向至 sso-server 认证中心，此时又分为两种情况：
//                     *      情况2.1：此用户在 sso-server 尚未登录，此时会停留在登录页面，开始输入账号密码进行登录
//                     *      情况2.2：此用户在 sso-server 已经登录（这证明此用户已经在其它至少一个 sso-client 处完成了登录）
//                     *              此时用户会继续重定向回当前 client，并携带 ticket 参数，完成登录。
//                     */
//                    if(!StpUtil.isLogin()) {
//                        System.out.println("当前未登录，准备重定向"+SaHolder.getRequest().getUrl());
//                        String back = SaFoxUtil.joinParam(SaHolder.getRequest().getUrl(), SpringMVCUtil.getRequest().getQueryString());
//                        SaHolder.getResponse().redirect("/sso/login?back=" + SaFoxUtil.encodeUrl(back));
//                        SaRouter.back();
//                    }
//                })
//                ;
//    }
    // Sa-Token 整合 jwt (Simple 简单模式)
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }
}
